package com.example.utils;

import com.example.exception.BusinessException;
import io.jsonwebtoken.io.IOException;
import org.springframework.web.multipart.MultipartFile;

import java.io.File;
import java.time.LocalDate;
import java.util.UUID;

/**
 * 对文件相关操作的工具类
 */
public class FileUtil {

    //实际项目需要把上传文件路径放在配置文件中读取
    public static final String uploadPath = "D:\\SSMProjectUploadFile";

    /**
     * 默认大小 10M
     */
    public static final long DEFAULT_MAX_SIZE = 10 * 1024 * 1024;



    //当使用工具类时，先判断文件路径是否存在
    static {
        checkDirPath(uploadPath);
    }


    /**
     * 保存在本机的文件上传
     * @param file
     * @return
     */
    public static String localUpload(MultipartFile file) {
        //验证文件是否存在
        if (file.isEmpty()){
            throw new BusinessException(500,"文件不存在");
        }
        //校验文件大小是否符合要求   比如 10Mb
        if (file.getSize() > DEFAULT_MAX_SIZE){
            throw new BusinessException(500,"文件大小超过上限");
        }
        //获取文件原始名称
        String originalFilename = file.getOriginalFilename();
        //校验文件是否属于允许上传的格式
        if (originalFilename.lastIndexOf(".") < 0){
            throw new BusinessException(500,"文件缺少后缀名");
        }
        //获取文件的后缀名 和 原始的文件名称
        String extension = originalFilename.substring(originalFilename.lastIndexOf(".")+1);
        String prefix = originalFilename.substring(0, originalFilename.lastIndexOf("."));
        //为文件生成不会重复的名称 上传文件的日期/文件的原始名称_随机的字符串：UUID .文件的原始格式
        LocalDate now = LocalDate.now();
        String dateDirPath = uploadPath+"\\"+now.getYear()+"\\"+now.getMonthValue()+"\\"+now.getDayOfMonth();
        checkDirPath(dateDirPath);
        String fileName = prefix+"_"+ UUID.randomUUID().toString().replace("-","")+'.'+extension;;
        //把文件保存到指定位置
        try {
            file.transferTo(new File(dateDirPath,fileName));
        }catch (java.io.IOException e) {
            throw new BusinessException(500,"文件保存失败");
        }
        //返回文件在系统中的路径
        return  dateDirPath+"\\"+fileName;
    }

    //验证要上传文件的路径是否存在，如果不存在则新建文件夹
    public  static void checkDirPath(String uploadPath){
        File file = new File(uploadPath);
        if (!file.exists()){
            file.mkdirs();
        }
    }
}